#pragma once
#include "kernel_operator.h"

/**
算子内部用到的utils函数
算子内部使用->__aicore__关键字
工具函数->inline关键字
*/





/**
 * @brief val 向上按照 align 的倍数取整
 * @param [in] T val：需要取整的数
 * @param [in] align：需要向上取整的最小粒度
 * @return T 向上对齐后的值
 */
template<typename T>
[aicore] inline __attribute__((always_inline)) T RoundUp (const T val, const T align) {
    if ( align == 0 ) {
        return 0;
    } else {
        return ( val + align - 1 ) / align * align ;
    }
}



/**
 * @brief val 向下按照 align 的倍数取整
 * @param [in] T val：需要取整的数
 * @param [in] T align：需要向下取整的最小粒度
 * @return T 向下对齐后的数
 */
template<typename T>
[aicore] inline __attribute__((always_inline)) T RoundDown ( const T val, const T align ) {
    if ( align == 0 ) {
        return 0;
    } else {
        return val / align * align;
    }
}

/**
 * @brief val 除以 divisor 向上取整 
 * @param [in] T val：被除数
 * @param [in] T divisor：除数
 * @return T val除以divisor向上取整的结果
 */
template<typename T>
[aicore] inline __attribute__((always_inline)) T CeilDiv ( const T val, const T divisor ){
    if (  divisor == 0 ) {
        return 0;
    } else {
        return ( val + divisor - 1 ) / divisor;
    }

}
